package com.test.tcp.multi;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 模拟登录(多个客户端请求)
 * 使用多线程来实现多个用户可以同时登录
 * <p>
 * 创建服务器
 * 1.使用serverSocket创建服务器,并指定端口
 * 2.阻塞式等待连接accept()方法
 * 3.操作:输入输出流操作
 * 4.释放资源
 *
 * @create: 2019-05-29 22:29
 **/
public class LoginMultiServer {

    public static void main(String[] args) throws IOException {
        System.out.println("服务器端已启动...");

        //1.使用serverSocket创建服务器,并指定端口
        ServerSocket socket = new ServerSocket(8888);

        while (true) {
            //2.阻塞式等待连接accept()方法
            Socket client = socket.accept();
            new Thread(new Channel(client)).start();
        }

//        socket.close();
    }

    /**
     * 一个channel就表示一个客户端的连接,如果有多个客户端来连接时就可以给每个客户端建立一个连接
     */
    static class Channel implements Runnable {

        private Socket client;
        //输入流
        private DataInputStream dis;
        //输出流,输出内容到客户端
        DataOutputStream dos;

        public Channel(Socket client) {
            this.client = client;
            try {
                dis = new DataInputStream(client.getInputStream());
                dos = new DataOutputStream(client.getOutputStream());
            } catch (IOException e) {
                e.printStackTrace();
                //出现异常时关闭socket连接
                try {
                    client.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }

        @Override
        public void run() {
            try {
                System.out.println("一个客户端请求了服务器");

                //用户名及密码
                String uname = "";
                String upwd = "";

                //获取内容
                String[] user = receive().split("&");
                for (String userInfo : user) {
                    String[] info = userInfo.split("=");
                    System.out.println(info[0] + "-->" + info[1]);
                    if (info[0].equals("uname")) {
                        uname = info[1];
                    } else {
                        upwd = info[1];
                    }
                }
                //发送数据
                send(uname, upwd);

                //4.释放资源
                if (dos != null) {
                    dos.close();
                }
                if (dis != null) {
                    dis.close();
                }
                if (client != null) {
                    client.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        //获取流内的内容
        public String receive() {
            String data = "";
            try {
                data = dis.readUTF();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return data;
        }

        //发送数据
        public void send(String uname, String upwd) throws Exception {
            //校验
            if (uname.equals("我怎能不变态") && upwd.equals("非处娶不得")) {
                //成功
                dos.writeUTF("登录成功");
            } else {
                //失败
                dos.writeUTF("登录失败");
            }
            //一个输出流写入内容时如果要把它输出出去,记得刷新flush流
            dos.flush();
        }
    }

}
